
const CompressionWebpackPlugin = require('compression-webpack-plugin');
const isProd = process.env.NODE_ENV === 'production';
const isOsss = process.env.OSS_ENV === 'prod';
const WebpackAliyunOss = require('webpack-aliyun-oss');
// 需要GZIP压缩的文件类型
const productionGzipExtensions = /\.(js|css|json|txt|html|ico|svg)(\?.*)?$/i;
const path = require('path');
function resolve (dir) {
    return path.join(__dirname, dir);
}

const port = 9604; // dev port

module.exports = {
    // publicPath: process.env.NODE_ENV === 'development' ? '/' : (process.env.VUE_APP_PUBLISH_URL ? process.env.VUE_APP_PUBLISH_URL : '/'),
    publicPath: '/',
    outputDir: 'admin-shop',
    assetsDir: 'static',
    lintOnSave: process.env.NODE_ENV === 'development' ? 'error' : false,
    productionSourceMap: false,
    devServer: {
        host: '0.0.0.0',
        port: port,
        open: true,
        overlay: {
            warnings: false,
            errors: true
        }
    },
    configureWebpack: config => {
        // cdn引用时,剔除依赖包
        config.externals = {
            'echarts': 'echarts',
            'vue-lazyload': 'VueLazyload'
        };
        if (isProd) {
            const plugins = [];
            // plugins.push(
            //     new CompressionWebpackPlugin({
            //         filename: '[path].gz[query]',
            //         algorithm: 'gzip',
            //         test: productionGzipExtensions,
            //         threshold: 10240, // 对超过10k的数据进行压缩
            //         minRatio: 0.8
            //     })
            // );
            // let webpackAliyunOss = [
            //     new WebpackAliyunOss({
            //         from: ['./admin-shop/**', '!./admin-shop/**/*.html'], // 上传那个文件或文件夹  可以是字符串或数组
            //         dist: isOsss ? '/shop-prod' : '/shop-test', // 需要上传到oss上的给定文件目录
            //         region: 'oss-us-west-1',
            //         accessKeyId: 'LTAI5t6x3FVvKm4PmfqK15wj',
            //         accessKeySecret: 'uJpK02U3l8mdgUX3XWevwOq6364mby',
            //         bucket: 'plusshop',
            //
            //         // test: true,
            //         // 上面一行，可以在进行测试看上传路径是否正确, 打开后只会显示上传路径并不会真正上传;
            //
            //         // 因为文件标识符 "\"  和 "/" 的区别 不进行 setOssPath配置,上传的文件夹就会拼到文件名上, 丢失了文件目录,所以需要对setOssPath 配置。
            //         // setOssPath: filePath => {
            //         //     // some operations to filePath
            //         //     let index = filePath.lastIndexOf('admin-shop');
            //         //     let Path = filePath.substring(index + 4, filePath.length);
            //         //     return Path.replace(/\\/g, '/');
            //         // },
            //         setHeaders: filePath => {
            //             // some operations to filePath
            //             // return false to use default header
            //             return {
            //                 'Cache-Control': 'max-age=31536000'
            //             };
            //         }
            //     })
            // ];
            config.plugins = [
                // ...webpackAliyunOss,
                ...config.plugins,
                ...plugins
            ];
        }
    },
    chainWebpack (config) {
        config.plugins.delete('preload');
        config.plugins.delete('prefetch');
        config.module
            .rule('svg')
            .exclude.add(resolve('src/icons'))
            .end();
        config.module
            .rule('icons')
            .test(/\.svg$/)
            .include.add(resolve('src/icons'))
            .end()
            .use('svg-sprite-loader')
            .loader('svg-sprite-loader')
            .options({
                symbolId: 'icon-[name]'
            })
            .end();
        config.module
            .rule('vue')
            .use('vue-loader')
            .loader('vue-loader')
            .tap(options => {
                options.compilerOptions.preserveWhitespace = true;
                return options;
            })
            .end();
        config.resolve.alias
            .set('@', resolve('src'))
            .set('_c', resolve('src/components'));
        config
            .when(!isProd,
                config => config.devtool('cheap-source-map')
            );

        config
            .when(isProd,
                config => {
                    // config
                    //     .plugin('ScriptExtHtmlWebpackPlugin')
                    //     .after('html')
                    //     .use('script-ext-html-webpack-plugin', [{
                    //         // `runtime` must same as runtimeChunk name. default is `runtime`
                    //         inline: /runtime\..*\.js$/
                    //     }])
                    //     .end();
                    config
                        .optimization.splitChunks({
                            chunks: 'all',
                            minSize: 1200000,
                            maxSize: 1400000, // 模块超过500k将被拆分
                            // minChunks: 3, // 模块被引用>=1次，便分割
                            // maxInitialRequests: 3, // 一个入口并发加载的chunk数量<=3
                            // maxAsyncRequests: 20, // 异步加载chunk的最大并行请求数
                            cacheGroups: {
                                libs: {
                                    name: 'chunk-libs',
                                    test: /[\\/]node_modules[\\/]/,
                                    priority: 10,
                                    chunks: 'initial' // 只打包初始时依赖的第三方
                                },
                                elementUI: {
                                    name: 'chunk-elementUI', // 单独将 elementUI 拆包
                                    priority: 20, // 权重要大于 libs 和 app 不然会被打包进 libs 或者 app
                                    test: /[\\/]node_modules[\\/]element-ui[\\/]/
                                },
                                commons: {
                                    name: 'chunk-commons',
                                    test: resolve('src/components'), // 可自定义拓展你的规则
                                    minChunks: 3, // 最小公用次数
                                    priority: 5,
                                    reuseExistingChunk: true
                                }
                            }
                        });
                    config.optimization.runtimeChunk('single');
                }
            );
    }
};
